Draw the focus, and leave space to do so.
authorHavoc Pennington <hp@redhat.com>
Mon, 25 Sep 2000 17:17:13 +0000 (17:17 +0000)
committerHavoc Pennington <hp@src.gnome.org>
Mon, 25 Sep 2000 17:17:13 +0000 (17:17 +0000)
2000-09-25  Havoc Pennington  <hp@redhat.com>

* gtk/gtktextview.c: Draw the focus, and leave space to do so.

* gtk/gtktexttypes.c: Remove Latin1 conversion stuff

* gtk/gtktextbtree.c (gtk_text_btree_node_remove_data):
Fix a bug when removing node data, we didn't properly
re-splice the linked list after removing the data.

* gtk/gtktextview.c (gtk_text_view_key_press_event): Pass through
GDK_Tab as literal tab, Ctrl-Tab to tab to focus widget

* gtk/gtktextbuffer.c (selection_received): fix g_convert usage

* gtk/gtktextlayout.c (set_para_values): Set tab array
for the layout from the GtkTextTag.

* gtk/gtktexttypes.h: delete tab and search cruft,
remove g_convert() in favor of GLib version

* gtk/gtktexttypes.c: remove tab implementation from here,
move to Pango

* gtk/gtktexttag.h, gtk/gtktexttag.c: Implement
tab stuff using new PangoTabArray from Pango

* gtk/gtktexttag.c (gtk_text_attributes_fill_from_tags): Remove
unused border_width stuff

20 files changed:
ChangeLog
ChangeLog.pre-2-0
ChangeLog.pre-2-10
ChangeLog.pre-2-2
ChangeLog.pre-2-4
ChangeLog.pre-2-6
ChangeLog.pre-2-8
docs/reference/gdk-pixbuf/tmpl/gdk-pixbuf-unused.sgml
gtk/gtktextbtree.c
gtk/gtktextbuffer.c
gtk/gtktextlayout.c
gtk/gtktextlayout.h
gtk/gtktexttag.c
gtk/gtktexttag.h
gtk/gtktexttypes.c
gtk/gtktexttypes.h
gtk/gtktextview.c
gtk/gtktextview.h
gtk/testtext.c
tests/testtext.c

index 057cf73e96ea5f1865d67d839a639221ca812687..329d1ec02b2752102b209f50a13a448542bb0c7d 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,33 @@
+2000-09-25  Havoc Pennington  <hp@redhat.com>
+
+       * gtk/gtktextview.c: Draw the focus, and leave space to do so.
+
+       * gtk/gtktexttypes.c: Remove Latin1 conversion stuff
+
+       * gtk/gtktextbtree.c (gtk_text_btree_node_remove_data): 
+       Fix a bug when removing node data, we didn't properly 
+       re-splice the linked list after removing the data.
+
+       * gtk/gtktextview.c (gtk_text_view_key_press_event): Pass through 
+       GDK_Tab as literal tab, Ctrl-Tab to tab to focus widget
+
+       * gtk/gtktextbuffer.c (selection_received): fix g_convert usage
+
+       * gtk/gtktextlayout.c (set_para_values): Set tab array 
+       for the layout from the GtkTextTag.
+
+       * gtk/gtktexttypes.h: delete tab and search cruft, 
+       remove g_convert() in favor of GLib version
+
+       * gtk/gtktexttypes.c: remove tab implementation from here,
+       move to Pango
+
+       * gtk/gtktexttag.h, gtk/gtktexttag.c: Implement 
+       tab stuff using new PangoTabArray from Pango
+
+       * gtk/gtktexttag.c (gtk_text_attributes_fill_from_tags): Remove
+       unused border_width stuff
+
 Thu Sep 14 12:21:12 2000  Owen Taylor  <otaylor@redhat.com>
 
         * gtk/gtktexttypes.[ch]: Remove g_convert (moved to
index 057cf73e96ea5f1865d67d839a639221ca812687..329d1ec02b2752102b209f50a13a448542bb0c7d 100644 (file)
@@ -1,3 +1,33 @@
+2000-09-25  Havoc Pennington  <hp@redhat.com>
+
+       * gtk/gtktextview.c: Draw the focus, and leave space to do so.
+
+       * gtk/gtktexttypes.c: Remove Latin1 conversion stuff
+
+       * gtk/gtktextbtree.c (gtk_text_btree_node_remove_data): 
+       Fix a bug when removing node data, we didn't properly 
+       re-splice the linked list after removing the data.
+
+       * gtk/gtktextview.c (gtk_text_view_key_press_event): Pass through 
+       GDK_Tab as literal tab, Ctrl-Tab to tab to focus widget
+
+       * gtk/gtktextbuffer.c (selection_received): fix g_convert usage
+
+       * gtk/gtktextlayout.c (set_para_values): Set tab array 
+       for the layout from the GtkTextTag.
+
+       * gtk/gtktexttypes.h: delete tab and search cruft, 
+       remove g_convert() in favor of GLib version
+
+       * gtk/gtktexttypes.c: remove tab implementation from here,
+       move to Pango
+
+       * gtk/gtktexttag.h, gtk/gtktexttag.c: Implement 
+       tab stuff using new PangoTabArray from Pango
+
+       * gtk/gtktexttag.c (gtk_text_attributes_fill_from_tags): Remove
+       unused border_width stuff
+
 Thu Sep 14 12:21:12 2000  Owen Taylor  <otaylor@redhat.com>
 
         * gtk/gtktexttypes.[ch]: Remove g_convert (moved to
index 057cf73e96ea5f1865d67d839a639221ca812687..329d1ec02b2752102b209f50a13a448542bb0c7d 100644 (file)
@@ -1,3 +1,33 @@
+2000-09-25  Havoc Pennington  <hp@redhat.com>
+
+       * gtk/gtktextview.c: Draw the focus, and leave space to do so.
+
+       * gtk/gtktexttypes.c: Remove Latin1 conversion stuff
+
+       * gtk/gtktextbtree.c (gtk_text_btree_node_remove_data): 
+       Fix a bug when removing node data, we didn't properly 
+       re-splice the linked list after removing the data.
+
+       * gtk/gtktextview.c (gtk_text_view_key_press_event): Pass through 
+       GDK_Tab as literal tab, Ctrl-Tab to tab to focus widget
+
+       * gtk/gtktextbuffer.c (selection_received): fix g_convert usage
+
+       * gtk/gtktextlayout.c (set_para_values): Set tab array 
+       for the layout from the GtkTextTag.
+
+       * gtk/gtktexttypes.h: delete tab and search cruft, 
+       remove g_convert() in favor of GLib version
+
+       * gtk/gtktexttypes.c: remove tab implementation from here,
+       move to Pango
+
+       * gtk/gtktexttag.h, gtk/gtktexttag.c: Implement 
+       tab stuff using new PangoTabArray from Pango
+
+       * gtk/gtktexttag.c (gtk_text_attributes_fill_from_tags): Remove
+       unused border_width stuff
+
 Thu Sep 14 12:21:12 2000  Owen Taylor  <otaylor@redhat.com>
 
         * gtk/gtktexttypes.[ch]: Remove g_convert (moved to
index 057cf73e96ea5f1865d67d839a639221ca812687..329d1ec02b2752102b209f50a13a448542bb0c7d 100644 (file)
@@ -1,3 +1,33 @@
+2000-09-25  Havoc Pennington  <hp@redhat.com>
+
+       * gtk/gtktextview.c: Draw the focus, and leave space to do so.
+
+       * gtk/gtktexttypes.c: Remove Latin1 conversion stuff
+
+       * gtk/gtktextbtree.c (gtk_text_btree_node_remove_data): 
+       Fix a bug when removing node data, we didn't properly 
+       re-splice the linked list after removing the data.
+
+       * gtk/gtktextview.c (gtk_text_view_key_press_event): Pass through 
+       GDK_Tab as literal tab, Ctrl-Tab to tab to focus widget
+
+       * gtk/gtktextbuffer.c (selection_received): fix g_convert usage
+
+       * gtk/gtktextlayout.c (set_para_values): Set tab array 
+       for the layout from the GtkTextTag.
+
+       * gtk/gtktexttypes.h: delete tab and search cruft, 
+       remove g_convert() in favor of GLib version
+
+       * gtk/gtktexttypes.c: remove tab implementation from here,
+       move to Pango
+
+       * gtk/gtktexttag.h, gtk/gtktexttag.c: Implement 
+       tab stuff using new PangoTabArray from Pango
+
+       * gtk/gtktexttag.c (gtk_text_attributes_fill_from_tags): Remove
+       unused border_width stuff
+
 Thu Sep 14 12:21:12 2000  Owen Taylor  <otaylor@redhat.com>
 
         * gtk/gtktexttypes.[ch]: Remove g_convert (moved to
index 057cf73e96ea5f1865d67d839a639221ca812687..329d1ec02b2752102b209f50a13a448542bb0c7d 100644 (file)
@@ -1,3 +1,33 @@
+2000-09-25  Havoc Pennington  <hp@redhat.com>
+
+       * gtk/gtktextview.c: Draw the focus, and leave space to do so.
+
+       * gtk/gtktexttypes.c: Remove Latin1 conversion stuff
+
+       * gtk/gtktextbtree.c (gtk_text_btree_node_remove_data): 
+       Fix a bug when removing node data, we didn't properly 
+       re-splice the linked list after removing the data.
+
+       * gtk/gtktextview.c (gtk_text_view_key_press_event): Pass through 
+       GDK_Tab as literal tab, Ctrl-Tab to tab to focus widget
+
+       * gtk/gtktextbuffer.c (selection_received): fix g_convert usage
+
+       * gtk/gtktextlayout.c (set_para_values): Set tab array 
+       for the layout from the GtkTextTag.
+
+       * gtk/gtktexttypes.h: delete tab and search cruft, 
+       remove g_convert() in favor of GLib version
+
+       * gtk/gtktexttypes.c: remove tab implementation from here,
+       move to Pango
+
+       * gtk/gtktexttag.h, gtk/gtktexttag.c: Implement 
+       tab stuff using new PangoTabArray from Pango
+
+       * gtk/gtktexttag.c (gtk_text_attributes_fill_from_tags): Remove
+       unused border_width stuff
+
 Thu Sep 14 12:21:12 2000  Owen Taylor  <otaylor@redhat.com>
 
         * gtk/gtktexttypes.[ch]: Remove g_convert (moved to
index 057cf73e96ea5f1865d67d839a639221ca812687..329d1ec02b2752102b209f50a13a448542bb0c7d 100644 (file)
@@ -1,3 +1,33 @@
+2000-09-25  Havoc Pennington  <hp@redhat.com>
+
+       * gtk/gtktextview.c: Draw the focus, and leave space to do so.
+
+       * gtk/gtktexttypes.c: Remove Latin1 conversion stuff
+
+       * gtk/gtktextbtree.c (gtk_text_btree_node_remove_data): 
+       Fix a bug when removing node data, we didn't properly 
+       re-splice the linked list after removing the data.
+
+       * gtk/gtktextview.c (gtk_text_view_key_press_event): Pass through 
+       GDK_Tab as literal tab, Ctrl-Tab to tab to focus widget
+
+       * gtk/gtktextbuffer.c (selection_received): fix g_convert usage
+
+       * gtk/gtktextlayout.c (set_para_values): Set tab array 
+       for the layout from the GtkTextTag.
+
+       * gtk/gtktexttypes.h: delete tab and search cruft, 
+       remove g_convert() in favor of GLib version
+
+       * gtk/gtktexttypes.c: remove tab implementation from here,
+       move to Pango
+
+       * gtk/gtktexttag.h, gtk/gtktexttag.c: Implement 
+       tab stuff using new PangoTabArray from Pango
+
+       * gtk/gtktexttag.c (gtk_text_attributes_fill_from_tags): Remove
+       unused border_width stuff
+
 Thu Sep 14 12:21:12 2000  Owen Taylor  <otaylor@redhat.com>
 
         * gtk/gtktexttypes.[ch]: Remove g_convert (moved to
index 057cf73e96ea5f1865d67d839a639221ca812687..329d1ec02b2752102b209f50a13a448542bb0c7d 100644 (file)
@@ -1,3 +1,33 @@
+2000-09-25  Havoc Pennington  <hp@redhat.com>
+
+       * gtk/gtktextview.c: Draw the focus, and leave space to do so.
+
+       * gtk/gtktexttypes.c: Remove Latin1 conversion stuff
+
+       * gtk/gtktextbtree.c (gtk_text_btree_node_remove_data): 
+       Fix a bug when removing node data, we didn't properly 
+       re-splice the linked list after removing the data.
+
+       * gtk/gtktextview.c (gtk_text_view_key_press_event): Pass through 
+       GDK_Tab as literal tab, Ctrl-Tab to tab to focus widget
+
+       * gtk/gtktextbuffer.c (selection_received): fix g_convert usage
+
+       * gtk/gtktextlayout.c (set_para_values): Set tab array 
+       for the layout from the GtkTextTag.
+
+       * gtk/gtktexttypes.h: delete tab and search cruft, 
+       remove g_convert() in favor of GLib version
+
+       * gtk/gtktexttypes.c: remove tab implementation from here,
+       move to Pango
+
+       * gtk/gtktexttag.h, gtk/gtktexttag.c: Implement 
+       tab stuff using new PangoTabArray from Pango
+
+       * gtk/gtktexttag.c (gtk_text_attributes_fill_from_tags): Remove
+       unused border_width stuff
+
 Thu Sep 14 12:21:12 2000  Owen Taylor  <otaylor@redhat.com>
 
         * gtk/gtktexttypes.[ch]: Remove g_convert (moved to
index 366c8c4450daf80ab6217a84b9b1e4b5a3d346af..a8f01a9aa01d6c009f763e71dee12808f5a081cc 100644 (file)
@@ -1,3 +1,7 @@
+<!-- ##### SECTION ./tmpl/from-drawables.sgml:Title ##### -->
+Drawables to Pixbufs
+
+
 <!-- ##### USER_FUNCTION GdkPixbufLastUnref ##### -->
   <para>
     A function of this type can be used to override the default
 @pixbuf: The pixbuf that is losing its last reference.
 @data: User closure data.
 
-<!-- ##### SECTION ./tmpl/from-drawables.sgml:Title ##### -->
-Drawables to Pixbufs
-
-
 <!-- ##### ARG GnomeCanvasPixbuf:height_pixels ##### -->
 <para>
 
index f59fa0c965e77fe179d0698aed05e8d5e0fd3a98..ca406099515d5ed3f35e09d70a3074f097cb39ca 100644 (file)
@@ -4724,6 +4724,7 @@ gtk_text_btree_node_remove_data(GtkTextBTreeNode *node, gpointer view_id)
       if (nd->view_id == view_id)
         break;
 
+      prev = nd;
       nd = nd->next;
     }
   
index 19549efdf96a9dda2afdb8b0bbe06105b139ad24..1ded48810e8ee22b9377d2ce34749248f42aeaf0 100644 (file)
@@ -1412,9 +1412,8 @@ clipboard_received (GtkClipboard *clipboard,
          else
            ; /* FIXME Delete selected chars and give up X selection */
        }
-#endif
-      
-      
+#endif      
+
       if (request_data->interactive)
        gtk_text_buffer_insert_interactive (buffer, &insert_point,
                                            str, -1, request_data->default_editable);
index 901aa92666b2141e82ea6dfd4729178f0da784ae..730b4fde46ccc615dcaf1a66d5480805cb228952 100644 (file)
@@ -1039,6 +1039,9 @@ set_para_values (GtkTextLayout      *layout,
   pango_layout_set_alignment (display->layout, pango_align);
   pango_layout_set_spacing (display->layout, style->pixels_inside_wrap * PANGO_SCALE);
 
+  if (style->tabs)
+    pango_layout_set_tabs (display->layout, style->tabs);
+  
   display->top_margin = style->pixels_above_lines;
   display->height = style->pixels_above_lines + style->pixels_below_lines;
   display->bottom_margin = style->pixels_below_lines;
index e06ed4fd3faa7be1d5f3d0b8bd7b1778a20660a2..79b569f61a5ff7dd2410e698c2960503c86f5cac 100644 (file)
@@ -46,6 +46,14 @@ struct _GtkTextLayout
   gint width;
   gint height;
 
+  /* Pixel offsets from the left and from the top to be used when we
+   * draw; these allow us to create left/top margins. We don't need
+   * anything special for bottom/right margins, because those don't
+   * affect drawing.
+   */
+  /* gint left_edge; */
+  /* gint top_edge; */
+  
   GtkTextBuffer *buffer;
 
   /* Default style used if no tags override it */
index 69edf7b3a0b37c5bbe8919da187a4a26f69e7bf7..2c13409c26e8e09567227734a9f93695f80155c8 100644 (file)
@@ -55,6 +55,7 @@
 #include "gtkmain.h"
 
 #include <stdlib.h>
+#include <string.h>
 
 enum {
   EVENT,
@@ -90,6 +91,7 @@ enum {
   ARG_OFFSET,
   ARG_BG_FULL_HEIGHT,
   ARG_LANGUAGE,
+  ARG_TABS,
   
   /* Whether-a-style-arg-is-set args */
   ARG_BACKGROUND_SET,
@@ -113,6 +115,7 @@ enum {
   ARG_OFFSET_SET,
   ARG_BG_FULL_HEIGHT_SET,
   ARG_LANGUAGE_SET,
+  ARG_TABS_SET,
   
   LAST_ARG
 };
@@ -218,6 +221,8 @@ gtk_text_tag_class_init (GtkTextTagClass *klass)
                            GTK_ARG_READWRITE, ARG_UNDERLINE);
   gtk_object_add_arg_type ("GtkTextTag::wrap_mode", GTK_TYPE_ENUM,
                            GTK_ARG_READWRITE, ARG_WRAP_MODE);
+  gtk_object_add_arg_type ("GtkTextTag::tabs", GTK_TYPE_POINTER,
+                           GTK_ARG_READWRITE, ARG_TABS);
   
   /* Style args are set or not */
   gtk_object_add_arg_type ("GtkTextTag::background_set", GTK_TYPE_BOOL,
@@ -262,6 +267,9 @@ gtk_text_tag_class_init (GtkTextTagClass *klass)
                            GTK_ARG_READWRITE, ARG_UNDERLINE_SET);
   gtk_object_add_arg_type ("GtkTextTag::wrap_mode_set", GTK_TYPE_BOOL,
                            GTK_ARG_READWRITE, ARG_WRAP_MODE_SET);
+  gtk_object_add_arg_type ("GtkTextTag::tabs_set", GTK_TYPE_BOOL,
+                           GTK_ARG_READWRITE, ARG_TABS_SET);
+
   
   signals[EVENT] =
     gtk_signal_new ("event",
@@ -580,6 +588,18 @@ gtk_text_tag_set_arg (GtkObject *object, GtkArg *arg, guint arg_id)
       tkxt_tag->language_set = TRUE;
       tkxt_tag->values->language = g_strdup (GTK_VALUE_STRING(*arg));
       break;
+
+    case ARG_TABS:
+      tkxt_tag->tabs_set = TRUE;
+
+      if (tkxt_tag->values->tabs)
+        pango_tab_array_free (tkxt_tag->values->tabs);
+      
+      tkxt_tag->values->tabs =
+        pango_tab_array_copy (GTK_VALUE_POINTER (*arg));
+
+      size_changed = TRUE;
+      break;
       
       /* Whether the value should be used... */
       
@@ -671,6 +691,11 @@ gtk_text_tag_set_arg (GtkObject *object, GtkArg *arg, guint arg_id)
       tkxt_tag->language_set = GTK_VALUE_BOOL(*arg);
       size_changed = TRUE;
       break;
+
+    case ARG_TABS_SET:
+      tkxt_tag->tabs_set = GTK_VALUE_BOOL (*arg);
+      size_changed = TRUE;
+      break;
       
     default:
       g_assert_not_reached();
@@ -800,6 +825,11 @@ gtk_text_tag_get_arg (GtkObject *object, GtkArg *arg, guint arg_id)
     case ARG_LANGUAGE:
       GTK_VALUE_STRING(*arg) = g_strdup (tag->values->language);
       break;
+
+    case ARG_TABS:
+      GTK_VALUE_POINTER (*arg) = tag->values->tabs ? 
+        pango_tab_array_copy (tag->values->tabs) : NULL;
+      break;
       
     case ARG_BACKGROUND_SET:
     case ARG_BACKGROUND_GDK_SET:
@@ -878,6 +908,10 @@ gtk_text_tag_get_arg (GtkObject *object, GtkArg *arg, guint arg_id)
     case ARG_LANGUAGE_SET:
       GTK_VALUE_BOOL(*arg) = tag->language_set;
       break;
+
+    case ARG_TABS_SET:
+      GTK_VALUE_BOOL (*arg) = tag->tabs_set;
+      break;
       
     case ARG_BACKGROUND:
     case ARG_FOREGROUND:
@@ -1050,7 +1084,7 @@ gtk_text_attributes_new(void)
 
 void
 gtk_text_attributes_copy(GtkTextAttributes *src,
-                           GtkTextAttributes *dest)
+                         GtkTextAttributes *dest)
 {
   guint orig_refcount;
 
@@ -1067,9 +1101,6 @@ gtk_text_attributes_copy(GtkTextAttributes *src,
   if (src->appearance.fg_stipple)
     gdk_bitmap_ref(src->appearance.fg_stipple);
 
-  if (src->tab_array)
-    gtk_text_view_tab_array_ref(src->tab_array);
-
   /* Remove refs */
   
   if (dest->appearance.bg_stipple)
@@ -1078,15 +1109,16 @@ gtk_text_attributes_copy(GtkTextAttributes *src,
   if (dest->appearance.fg_stipple)
     gdk_bitmap_unref(dest->appearance.fg_stipple);
 
-  if (dest->tab_array)
-    gtk_text_view_tab_array_unref(dest->tab_array);
-
   /* Copy */
   orig_refcount = dest->refcount;
   
   *dest = *src;
 
   dest->font_desc = pango_font_description_copy (src->font_desc);
+
+  if (src->tabs)
+    dest->tabs = pango_tab_array_copy (src->tabs);
+
   dest->language = g_strdup (src->language);
   
   dest->refcount = orig_refcount;
@@ -1122,8 +1154,8 @@ gtk_text_attributes_unref(GtkTextAttributes *values)
       if (values->appearance.fg_stipple)
         gdk_bitmap_unref(values->appearance.fg_stipple);
 
-      if (values->tab_array)
-        gtk_text_view_tab_array_unref(values->tab_array);
+      if (values->tabs)
+        pango_tab_array_free (values->tabs);
 
       if (values->language)
         g_free (values->language);
@@ -1197,10 +1229,7 @@ gtk_text_attributes_fill_from_tags(GtkTextAttributes *dest,
           dest->appearance.bg_color = vals->appearance.bg_color;
           
           dest->appearance.draw_bg = TRUE;
-        }
-      
-      if (tag->border_width_set)
-        dest->border_width = vals->border_width;
+        }      
 
       if (tag->relief_set)
         dest->relief = vals->relief;
@@ -1260,12 +1289,11 @@ gtk_text_attributes_fill_from_tags(GtkTextAttributes *dest,
       if (tag->pixels_inside_wrap_set)
         dest->pixels_inside_wrap = vals->pixels_inside_wrap;
 
-      if (tag->tab_array_set)
+      if (tag->tabs_set)
         {
-          gtk_text_view_tab_array_ref(vals->tab_array);
-          if (dest->tab_array)
-            gtk_text_view_tab_array_unref(dest->tab_array);
-          dest->tab_array = vals->tab_array;
+          if (dest->tabs)
+            pango_tab_array_free (dest->tabs);
+          dest->tabs = pango_tab_array_copy (vals->tabs);
         }
 
       if (tag->wrap_mode_set)
index 4b522c6c6651cf9d358e0cc105308dde0a24ba62..91a0591f3075c41a91684ee1bcd37ebec2772a20 100644 (file)
@@ -11,9 +11,9 @@ extern "C" {
 typedef struct _GtkTextIter GtkTextIter;
 typedef struct _GtkTextBTreeNode GtkTextBTreeNode;
 typedef struct _GtkTextTagTable GtkTextTagTable;
-typedef struct _GtkTextTabArray GtkTextTabArray;
 
-typedef enum {
+typedef enum
+{
   GTK_WRAPMODE_NONE,
   GTK_WRAPMODE_CHAR,
   GTK_WRAPMODE_WORD
@@ -54,11 +54,10 @@ struct _GtkTextTag {
 
   GtkTextAttributes *values;  
   
-  /*
-    Flags for whether a given value is set; if a value is unset, then
-    this tag does not affect it.  */
+  /* Flags for whether a given value is set; if a value is unset, then
+   * this tag does not affect it.
+   */
   guint bg_color_set : 1;
-  guint border_width_set : 1;
   guint relief_set : 1;
   guint bg_stipple_set : 1;
   guint fg_color_set : 1;
@@ -73,7 +72,7 @@ struct _GtkTextTag {
   guint pixels_above_lines_set : 1;
   guint pixels_below_lines_set : 1;
   guint pixels_inside_wrap_set : 1;
-  guint tab_array_set : 1;
+  guint tabs_set : 1;
   guint underline_set : 1;
   guint wrap_mode_set : 1;
   guint bg_full_height_set : 1;
@@ -123,7 +122,8 @@ struct _GtkTextAppearance
   /* Whether to use background-related values; this is irrelevant for
    * the values struct when in a tag, but is used for the composite
    * values struct; it's true if any of the tags being composited
-   * had background stuff set. */
+   * had background stuff set.
+   */
   guint draw_bg : 1;
 
   /* This is only used when we are actually laying out and rendering
@@ -139,7 +139,6 @@ struct _GtkTextAttributes
 
   GtkTextAppearance appearance;
   
-  gint border_width;
   GtkShadowType relief;
   GtkJustification justify;
   GtkTextDirection direction;
@@ -163,7 +162,7 @@ struct _GtkTextAttributes
 
   gint pixels_inside_wrap;
 
-  GtkTextTabArray *tab_array;
+  PangoTabArray *tabs;
   
   GtkWrapMode wrap_mode;       /* How to handle wrap-around for this tag.
                                 * Must be GTK_WRAPMODE_CHAR,
@@ -176,7 +175,8 @@ struct _GtkTextAttributes
   guint invisible : 1;
 
   /* Background is fit to full line height rather than
-   * baseline +/- ascent/descent (font height) */
+   * baseline +/- ascent/descent (font height)
+   */
   guint bg_full_height : 1;
   
   /* can edit this text */
@@ -197,7 +197,6 @@ void                gtk_text_attributes_copy      (GtkTextAttributes *src,
 void                gtk_text_attributes_unref     (GtkTextAttributes *values);
 void                gtk_text_attributes_ref       (GtkTextAttributes *values);
 
-
 #ifdef __cplusplus
 }
 #endif /* __cplusplus */
index 866344ab46114b338220898242ee91182401c1d4..a740fc6b398b6567d54085e31b90bef5acd6b03d 100644 (file)
@@ -1,47 +1,5 @@
 #include "gtktexttypes.h"
 
-
-/*
- * Tab array
- */
-
-GtkTextTabArray*
-gtk_text_view_tab_array_new(guint size)
-{
-  GtkTextTabArray *array;
-
-  array = g_new0(GtkTextTabArray, 1);
-
-  array->refcount = 1;
-  array->numTabs = size;
-  array->tabs = g_new0(GtkTextTab, size);
-
-  return array;
-}
-
-void
-gtk_text_view_tab_array_ref(GtkTextTabArray *tab_array)
-{
-  g_return_if_fail(tab_array != NULL);
-
-  tab_array->refcount += 1;
-}
-
-void
-gtk_text_view_tab_array_unref(GtkTextTabArray *tab_array)
-{
-  g_return_if_fail(tab_array != NULL);
-  g_return_if_fail(tab_array->refcount > 0);
-
-  tab_array->refcount -= 1;
-
-  if (tab_array->refcount == 0)
-    {
-      g_free(tab_array->tabs);
-      g_free(tab_array);
-    }
-}
-
 /* These are used to represent embedded non-character objects
  * if you return a string representation of a text buffer
  */
@@ -59,4 +17,3 @@ gtk_text_byte_begins_utf8_char(const gchar *byte)
 {
   return inline_byte_begins_utf8_char(byte);
 }
-
index 58de8618acf3141df10967c8c41b71dfd56d245d..85aeb7f850590235974433111dc5e697bde545de 100644 (file)
@@ -15,83 +15,8 @@ typedef struct _GtkTextCounter GtkTextCounter;
 typedef struct _GtkTextLineSegment GtkTextLineSegment;
 typedef struct _GtkTextLineSegmentClass GtkTextLineSegmentClass;
 typedef struct _GtkTextToggleBody GtkTextToggleBody;
-typedef struct _GtkTextViewSearch GtkTextViewSearch;
-typedef struct _GtkTextTab GtkTextTab;
-typedef struct _GtkTextViewStyle GtkTextViewStyle;
 typedef struct _GtkTextMarkBody GtkTextMarkBody;
 
-/*
- * Search
- */
-
-/*
- * The data structure below is used for searching a B-tree for transitions
- * on a single tag (or for all tag transitions).  No code outside of
- * tkTextBTree.c should ever modify any of the fields in these structures,
- * but it's OK to use them for read-only information.
- */
-
-struct _GtkTextViewSearch {
-  GtkTextBTree *tree;
-  
-  GtkTextIter curIndex;                /* Position of last tag transition
-                                        * returned by gtk_text_btree_next_tag, or
-                                        * index of start of segment
-                                        * containing starting position for
-                                        * search if gtk_text_btree_next_tag hasn't
-                                        * been called yet, or same as
-                                        * stopIndex if search is over. */
-
-  GtkTextLineSegment *segPtr;          /* Actual tag segment returned
-                                           by last call to
-                                           gtk_text_btree_next_tag,
-                                           or NULL if 
-                                           gtk_text_btree_next_tag
-                                           hasn't returned  anything
-                                           yet. */
-  
-  GtkTextLineSegment *lastPtr;         /* Stop search before just before
-                                        * considering this segment. */
-  GtkTextTag *tag;                     /* Tag to search for (or tag found, if
-                                        * allTags is non-zero). */
-  int linesLeft;                       /* Lines left to search (including
-                                        * curIndex and stopIndex).  When
-                                        * this becomes <= 0 the search is
-                                        * over. */
-  int allTags;                 /* Non-zero means ignore tag check:
-                                 * search for transitions on all
-                                 * tags. */
-};
-
-/*
- * The following data structure describes a single tab stop.
- */
-
-typedef enum {
-  GTK_TEXT_TAB_LEFT,
-  GTK_TEXT_TAB_RIGHT,
-  GTK_TEXT_TAB_CENTER,
-  GTK_TEXT_TAB_NUMERIC
-} GtkTextTabAlign;
-
-struct _GtkTextTab {
-    int location;                      /* Offset in pixels of this tab stop
-                                        * from the left margin (lmargin2) of
-                                        * the text. */
-    GtkTextTabAlign alignment;         /* Where the tab stop appears relative
-                                        * to the text. */
-};
-
-struct _GtkTextTabArray {
-  guint refcount;
-  int numTabs;                 /* Number of tab stops. */
-  GtkTextTab *tabs;
-};
-
-GtkTextTabArray *gtk_text_view_tab_array_new   (guint             size);
-void              gtk_text_view_tab_array_ref   (GtkTextTabArray *tab_array);
-void              gtk_text_view_tab_array_unref (GtkTextTabArray *tab_array);
-
 /*
  * Declarations for variables shared among the text-related files:
  */
index 55b378c6e92c5b2b710ee8effc038b8c578ccdda..19e4cd4248485e8b2fa82059d74050c3d0915fc8 100644 (file)
 #include "gtktexttypes.h"
 #include <string.h>
 
+#define FOCUS_RECT_WIDTH 10
+#if 0
+#define SCREEN_WIDTH(widget) (MAX (GTK_WIDGET(widget)->allocation.width - FOCUS_RECT_WIDTH*2, 0))
+#define SCREEN_HEIGHT(widget) (MAX (GTK_WIDGET(widget)->allocation.height - FOCUS_RECT_WIDTH*2, 0))
+#else
+#define SCREEN_WIDTH(widget) GTK_WIDGET(widget)->allocation.width
+#define SCREEN_HEIGHT(widget) GTK_WIDGET(widget)->allocation.height
+#endif
+
 enum {
   MOVE,
   SET_ANCHOR,
@@ -127,6 +136,7 @@ static void gtk_text_view_draw                 (GtkWidget        *widget,
                                                GdkRectangle     *area);
 static gint gtk_text_view_expose_event         (GtkWidget        *widget,
                                                GdkEventExpose   *expose);
+static void gtk_text_view_draw_focus           (GtkWidget        *widget);
 
 
 /* Source side drag signals */
@@ -189,9 +199,9 @@ static void     gtk_text_view_validate_onscreen     (GtkTextView        *text_vi
 static void     gtk_text_view_get_first_para_iter   (GtkTextView        *text_view,
                                                     GtkTextIter        *iter);
 static void     gtk_text_view_scroll_calc_now       (GtkTextView        *text_view);
-static void     gtk_text_view_set_values_from_style (GtkTextView        *text_view,
-                                                    GtkTextAttributes *values,
-                                                    GtkStyle           *style);
+static void     gtk_text_view_set_attributes_from_style (GtkTextView        *text_view,
+                                                         GtkTextAttributes *values,
+                                                         GtkStyle           *style);
 static void     gtk_text_view_ensure_layout         (GtkTextView        *text_view);
 static void     gtk_text_view_destroy_layout        (GtkTextView        *text_view);
 static void     gtk_text_view_start_selection_drag  (GtkTextView        *text_view,
@@ -205,8 +215,8 @@ static void     gtk_text_view_start_selection_dnd   (GtkTextView        *text_vi
 static void     gtk_text_view_start_cursor_blink    (GtkTextView        *text_view);
 static void     gtk_text_view_stop_cursor_blink     (GtkTextView        *text_view);
 
-static void gtk_text_view_value_changed (GtkAdjustment *adj,
-                                        GtkTextView   *view);
+static void gtk_text_view_value_changed             (GtkAdjustment *adj,
+                                                     GtkTextView   *view);
 static void gtk_text_view_commit_handler            (GtkIMContext  *context,
                                                     const gchar   *str,
                                                     GtkTextView   *text_view);
@@ -571,7 +581,8 @@ gtk_text_view_class_init (GtkTextViewClass *klass)
   widget_class->motion_notify_event = gtk_text_view_motion_event;
   widget_class->expose_event = gtk_text_view_expose_event;
   widget_class->draw = gtk_text_view_draw;
-
+  widget_class->draw_focus = gtk_text_view_draw_focus;
+  
   widget_class->drag_begin = gtk_text_view_drag_begin;
   widget_class->drag_end = gtk_text_view_drag_end;
   widget_class->drag_data_get = gtk_text_view_drag_data_get;
@@ -783,8 +794,8 @@ gtk_text_view_scroll_to_mark_adjusted (GtkTextView *text_view,
 
   screen.x = current_x_scroll;
   screen.y = current_y_scroll;
-  screen.width = widget->allocation.width;
-  screen.height = widget->allocation.height;
+  screen.width = SCREEN_WIDTH (widget);
+  screen.height = SCREEN_HEIGHT (widget);
 
   {
     /* Clamp margin so it's not too large. */
@@ -921,8 +932,8 @@ gtk_text_view_get_visible_rect (GtkTextView  *text_view,
     {
       visible_rect->x = text_view->xoffset;
       visible_rect->y = text_view->yoffset;
-      visible_rect->width = widget->allocation.width;
-      visible_rect->height = widget->allocation.height;
+      visible_rect->width = SCREEN_WIDTH (widget);
+      visible_rect->height = SCREEN_HEIGHT (widget);
     }
 }
 
@@ -1174,14 +1185,14 @@ gtk_text_view_size_allocate (GtkWidget *widget,
 
   gtk_text_view_ensure_layout (text_view);
   gtk_text_layout_set_screen_width (text_view->layout,
-                                    GTK_WIDGET (text_view)->allocation.width);
+                                    SCREEN_WIDTH (text_view));
       
   gtk_text_view_validate_onscreen (text_view);
   gtk_text_view_scroll_calc_now (text_view);
 
-  /* Now adjust the value of the adjustment to keep the cursor at the same place in
-   * the buffer 
-  */
+  /* Now adjust the value of the adjustment to keep the cursor at the
+   * same place in the buffer
+   */
   gtk_text_view_get_first_para_iter (text_view, &first_para);
   gtk_text_layout_get_line_yrange (text_view->layout, &first_para, &y, NULL);
 
@@ -1201,16 +1212,18 @@ gtk_text_view_size_allocate (GtkWidget *widget,
       yoffset_changed = TRUE;
     }
   
-  text_view->hadjustment->page_size = allocation->width;
-  text_view->hadjustment->page_increment = allocation->width / 2;
+  text_view->hadjustment->page_size = SCREEN_WIDTH (text_view);
+  text_view->hadjustment->page_increment = SCREEN_WIDTH (text_view) / 2;
   text_view->hadjustment->lower = 0;
-  text_view->hadjustment->upper = MAX (allocation->width, text_view->width);
+  text_view->hadjustment->upper = MAX (SCREEN_WIDTH (text_view),
+                                       text_view->width);
   gtk_signal_emit_by_name (GTK_OBJECT (text_view->hadjustment), "changed");
 
-  text_view->vadjustment->page_size = allocation->height;
-  text_view->vadjustment->page_increment = allocation->height / 2;
+  text_view->vadjustment->page_size = SCREEN_HEIGHT (text_view);
+  text_view->vadjustment->page_increment = SCREEN_HEIGHT (text_view) / 2;
   text_view->vadjustment->lower = 0;
-  text_view->vadjustment->upper = MAX (allocation->height, text_view->height);
+  text_view->vadjustment->upper = MAX (SCREEN_HEIGHT (text_view),
+                                       text_view->height);
   gtk_signal_emit_by_name (GTK_OBJECT (text_view->vadjustment), "changed");
 
   if (yoffset_changed)
@@ -1230,13 +1243,15 @@ gtk_text_view_validate_onscreen (GtkTextView *text_view)
 {
   GtkWidget *widget = GTK_WIDGET (text_view);
   
-  if (widget->allocation.height > 0)
+  if (SCREEN_HEIGHT (widget) > 0)
     {
       GtkTextIter first_para;
       gtk_text_view_get_first_para_iter (text_view, &first_para);
       gtk_text_layout_validate_yrange (text_view->layout,
                                       &first_para,
-                                      0, text_view->first_para_pixels + widget->allocation.height);
+                                      0,
+                                       text_view->first_para_pixels +
+                                       SCREEN_HEIGHT (widget));
     }
 }
 
@@ -1434,7 +1449,7 @@ gtk_text_view_style_set (GtkWidget *widget,
       gdk_window_set_background (text_view->bin_window,
                                 &widget->style->base[GTK_WIDGET_STATE (widget)]);
 
-      gtk_text_view_set_values_from_style (text_view, text_view->layout->default_style, widget->style);
+      gtk_text_view_set_attributes_from_style (text_view, text_view->layout->default_style, widget->style);
       gtk_text_layout_default_style_changed (text_view->layout);
     }
 }
@@ -1606,6 +1621,17 @@ gtk_text_view_key_press_event (GtkWidget *widget, GdkEventKey *event)
                                     0);
       return TRUE;
     }
+  /* Pass through Tab as literal tab, unless Control is held down */
+  else if (event->keyval == GDK_Tab && !(event->state & GDK_CONTROL_MASK))
+    {
+      gtk_text_buffer_insert_interactive_at_cursor (text_view->buffer, "\t", 1,
+                                                    text_view->editable);
+      gtk_text_view_scroll_to_mark (text_view,
+                                    gtk_text_buffer_get_mark (text_view->buffer,
+                                                              "insert"),
+                                    0);
+      return TRUE;
+    }
   else
     return FALSE;
 }
@@ -1702,7 +1728,8 @@ gtk_text_view_focus_in_event (GtkWidget *widget, GdkEventFocus *event)
   GtkTextView *text_view = GTK_TEXT_VIEW (widget);
   
   GTK_WIDGET_SET_FLAGS (widget, GTK_HAS_FOCUS);
-
+  gtk_widget_draw_focus (widget);
+  
   if (text_view->cursor_visible && text_view->layout)
     {
       gtk_text_layout_set_cursor_visible (text_view->layout, TRUE);
@@ -1720,7 +1747,8 @@ gtk_text_view_focus_out_event (GtkWidget *widget, GdkEventFocus *event)
   GtkTextView *text_view = GTK_TEXT_VIEW (widget);
   
   GTK_WIDGET_UNSET_FLAGS (widget, GTK_HAS_FOCUS);
-
+  gtk_widget_draw_focus (widget);
+  
   if (text_view->cursor_visible && text_view->layout)
     {
       gtk_text_layout_set_cursor_visible (text_view->layout, FALSE);
@@ -1761,7 +1789,8 @@ gtk_text_view_paint (GtkWidget *widget, GdkRectangle *area)
   gtk_text_layout_draw (text_view->layout,
                         widget,
                         text_view->bin_window,
-                        text_view->xoffset, text_view->yoffset,
+                        text_view->xoffset,
+                        text_view->yoffset,
                        area->x, area->y,
                        area->width, area->height);
 }
@@ -1781,6 +1810,23 @@ gtk_text_view_expose_event (GtkWidget *widget, GdkEventExpose *event)
   return TRUE;
 }
 
+static void
+gtk_text_view_draw_focus (GtkWidget *widget)
+{
+  if (GTK_WIDGET_DRAWABLE (widget))
+    {
+      if (GTK_WIDGET_HAS_FOCUS (widget))
+       {
+
+          gtk_paint_focus (widget->style, widget->window, 
+                           NULL, widget, "textview",
+                            0, 0,
+                            widget->allocation.width - 1,
+                            widget->allocation.height - 1);
+       }
+    }
+}
+
 /*
  * Blink!
  */
@@ -1987,10 +2033,10 @@ gtk_text_view_scroll_pages (GtkTextView *text_view,
   
   gtk_text_layout_validate_yrange (text_view->layout, &anchor, y0, y1);
 
-
   gtk_text_view_get_virtual_cursor_pos (text_view, &cursor_x_pos, &cursor_y_pos);
 
   newval = adj->value;
+
   newval += count * adj->page_increment;
 
   cursor_y_pos += newval - adj->value;
@@ -2222,9 +2268,9 @@ move_insert_to_pointer_and_scroll (GtkTextView *text_view, gboolean partial_scro
      in case you want to do a continuous slow scroll. */
 #define SLOW_SCROLL_TH 7
   if (x >= (0 - SLOW_SCROLL_TH) &&
-      x < (GTK_WIDGET (text_view)->allocation.width + SLOW_SCROLL_TH) &&
+      x < (SCREEN_WIDTH (text_view) + SLOW_SCROLL_TH) &&
       y >= (0 - SLOW_SCROLL_TH) &&
-      y < (GTK_WIDGET (text_view)->allocation.height + SLOW_SCROLL_TH))
+      y < (SCREEN_HEIGHT (text_view) + SLOW_SCROLL_TH))
     {
       adjust = 0;
       in_threshold = TRUE;
@@ -2394,13 +2440,12 @@ static void
 gtk_text_view_scroll_calc_now (GtkTextView *text_view)
 {
   gint width = 0, height = 0;
-  GtkWidget *widget = GTK_WIDGET (text_view);
   
   gtk_text_view_ensure_layout (text_view);
 
       
   gtk_text_layout_set_screen_width (text_view->layout,
-                                    widget->allocation.width);
+                                    SCREEN_WIDTH (text_view));
       
   gtk_text_layout_get_size (text_view->layout, &width, &height);
 
@@ -2427,9 +2472,9 @@ gtk_text_view_scroll_calc_now (GtkTextView *text_view)
       text_view->height = height;
       
       gtk_text_view_set_adjustment_upper (get_hadjustment (text_view),
-                                         MAX (widget->allocation.width, width));
+                                         MAX (SCREEN_WIDTH (text_view), width));
       gtk_text_view_set_adjustment_upper (get_vadjustment (text_view), 
-                                         MAX (widget->allocation.height, height));
+                                         MAX (SCREEN_HEIGHT (text_view), height));
 
       /* hadj/vadj exist since we called get_hadjustment/get_vadjustment above */
       
@@ -2437,21 +2482,21 @@ gtk_text_view_scroll_calc_now (GtkTextView *text_view)
          our allocation minus one step, and a step is
          1/10 of our allocation. */
       text_view->hadjustment->step_increment =
-        GTK_WIDGET (text_view)->allocation.width/10.0;
+        SCREEN_WIDTH (text_view) / 10.0;
       text_view->hadjustment->page_increment =
-        GTK_WIDGET (text_view)->allocation.width  *0.9;
+        SCREEN_WIDTH (text_view) * 0.9;
 
       text_view->vadjustment->step_increment =
-        GTK_WIDGET (text_view)->allocation.height/10.0;
+        SCREEN_HEIGHT (text_view) / 10.0;
       text_view->vadjustment->page_increment =
-        GTK_WIDGET (text_view)->allocation.height  *0.9;
+        SCREEN_HEIGHT (text_view) * 0.9;
     } 
 }
 
 static void
-gtk_text_view_set_values_from_style (GtkTextView        *text_view,
-                                    GtkTextAttributes *values,
-                                    GtkStyle           *style)
+gtk_text_view_set_attributes_from_style (GtkTextView        *text_view,
+                                         GtkTextAttributes *values,
+                                         GtkStyle           *style)
 {
   values->appearance.bg_color = style->base[GTK_STATE_NORMAL];
   values->appearance.fg_color = style->fg[GTK_STATE_NORMAL];
@@ -2507,7 +2552,8 @@ gtk_text_view_ensure_layout (GtkTextView *text_view)
       style = gtk_text_attributes_new ();
 
       gtk_widget_ensure_style (widget);
-      gtk_text_view_set_values_from_style (text_view, style, widget->style);
+      gtk_text_view_set_attributes_from_style (text_view,
+                                               style, widget->style);
       
       style->pixels_above_lines = 2;
       style->pixels_below_lines = 2;
@@ -2691,7 +2737,7 @@ gtk_text_view_drag_motion (GtkWidget        *widget,
        the selection. */
     gint margin;
     
-    margin = MIN (widget->allocation.width, widget->allocation.height);
+    margin = MIN (SCREEN_WIDTH (widget), SCREEN_HEIGHT (widget));
     margin /= 5;
     
     gtk_text_view_scroll_to_mark_adjusted (text_view,
@@ -2752,6 +2798,7 @@ gtk_text_view_drag_data_received (GtkWidget        *widget,
                                     drag_target_mark);
 
   str = gtk_selection_data_get_text (selection_data);
+
   if (str)
     {
       gtk_text_buffer_insert_interactive (text_view->buffer,
index 1b32c0386d805fa398f6ec58524124d722af4558..affbd341e9b3cd4235b3f0b2309d29c45fff359d 100644 (file)
@@ -88,7 +88,7 @@ struct _GtkTextViewClass {
   void (* paste_clipboard) (GtkTextView *text_view);
   /* overwrite */
   void (* toggle_overwrite) (GtkTextView *text_view);
-  void  (*set_scroll_adjustments)   (GtkTextView    *text_view,
+  void (* set_scroll_adjustments)   (GtkTextView    *text_view,
                                     GtkAdjustment  *hadjustment,
                                     GtkAdjustment  *vadjustment);
 };
index 4b53e46738e3a75a230d897eaf47b3d90fc3a429..8fa5718f759c1a6f90039e87ed5fc823f9afd396 100644 (file)
@@ -22,6 +22,7 @@ struct _Buffer
   gint untitled_serial;
   GtkTextTag *not_editable_tag;
   GtkTextTag *found_text_tag;
+  GtkTextTag *custom_tabs_tag;
 };
 
 struct _View
@@ -895,6 +896,34 @@ do_apply_editable (gpointer callback_data,
     }
 }
 
+
+static void
+do_apply_tabs (gpointer callback_data,
+               guint callback_action,
+               GtkWidget *widget)
+{
+  View *view = view_from_widget (widget);
+  GtkTextIter start;
+  GtkTextIter end;
+  
+  if (gtk_text_buffer_get_selection_bounds (view->buffer->buffer,
+                                            &start, &end))
+    {
+      if (callback_action)
+        {
+          gtk_text_buffer_remove_tag (view->buffer->buffer,
+                                      view->buffer->custom_tabs_tag,
+                                      &start, &end);
+        }
+      else
+        {
+          gtk_text_buffer_apply_tag (view->buffer->buffer,
+                                     view->buffer->custom_tabs_tag,
+                                     &start, &end);
+        }
+    }
+}
+
 static void
 dialog_response_callback (GtkWidget *dialog, gint response_id, gpointer data)
 {
@@ -1033,6 +1062,8 @@ static GtkItemFactoryEntry menu_items[] =
   { "/_Attributes",      NULL,         0,                0, "<Branch>" },
   { "/Attributes/Editable",      NULL,         do_apply_editable, TRUE, NULL },
   { "/Attributes/Not editable",          NULL,         do_apply_editable, FALSE, NULL },
+  { "/Attributes/Custom tabs",           NULL,         do_apply_tabs, FALSE, NULL },
+  { "/Attributes/Default tabs",          NULL,         do_apply_tabs, TRUE, NULL },
   { "/_Test",           NULL,         0,           0, "<Branch>" },
   { "/Test/_Example",           NULL,         do_example,  0, NULL },
 };
@@ -1187,7 +1218,8 @@ static Buffer *
 create_buffer (void)
 {
   Buffer *buffer;
-
+  PangoTabArray *tabs;
+  
   buffer = g_new (Buffer, 1);
 
   buffer->buffer = gtk_text_buffer_new (NULL);
@@ -1206,6 +1238,20 @@ create_buffer (void)
   buffer->found_text_tag = gtk_text_buffer_create_tag (buffer->buffer, NULL);
   gtk_object_set (GTK_OBJECT (buffer->found_text_tag),
                   "foreground", "red", NULL);
+
+  tabs = pango_tab_array_new_with_defaults (4,
+                                            TRUE,
+                                            PANGO_TAB_LEFT, 10,
+                                            PANGO_TAB_LEFT, 30,
+                                            PANGO_TAB_LEFT, 60,
+                                            PANGO_TAB_LEFT, 120);
+  
+  buffer->custom_tabs_tag = gtk_text_buffer_create_tag (buffer->buffer, NULL);
+  gtk_object_set (GTK_OBJECT (buffer->custom_tabs_tag),
+                  "tabs", tabs,
+                  "foreground", "green", NULL);
+
+  pango_tab_array_free (tabs);
   
   buffers = g_slist_prepend (buffers, buffer);
   
index 4b53e46738e3a75a230d897eaf47b3d90fc3a429..8fa5718f759c1a6f90039e87ed5fc823f9afd396 100644 (file)
@@ -22,6 +22,7 @@ struct _Buffer
   gint untitled_serial;
   GtkTextTag *not_editable_tag;
   GtkTextTag *found_text_tag;
+  GtkTextTag *custom_tabs_tag;
 };
 
 struct _View
@@ -895,6 +896,34 @@ do_apply_editable (gpointer callback_data,
     }
 }
 
+
+static void
+do_apply_tabs (gpointer callback_data,
+               guint callback_action,
+               GtkWidget *widget)
+{
+  View *view = view_from_widget (widget);
+  GtkTextIter start;
+  GtkTextIter end;
+  
+  if (gtk_text_buffer_get_selection_bounds (view->buffer->buffer,
+                                            &start, &end))
+    {
+      if (callback_action)
+        {
+          gtk_text_buffer_remove_tag (view->buffer->buffer,
+                                      view->buffer->custom_tabs_tag,
+                                      &start, &end);
+        }
+      else
+        {
+          gtk_text_buffer_apply_tag (view->buffer->buffer,
+                                     view->buffer->custom_tabs_tag,
+                                     &start, &end);
+        }
+    }
+}
+
 static void
 dialog_response_callback (GtkWidget *dialog, gint response_id, gpointer data)
 {
@@ -1033,6 +1062,8 @@ static GtkItemFactoryEntry menu_items[] =
   { "/_Attributes",      NULL,         0,                0, "<Branch>" },
   { "/Attributes/Editable",      NULL,         do_apply_editable, TRUE, NULL },
   { "/Attributes/Not editable",          NULL,         do_apply_editable, FALSE, NULL },
+  { "/Attributes/Custom tabs",           NULL,         do_apply_tabs, FALSE, NULL },
+  { "/Attributes/Default tabs",          NULL,         do_apply_tabs, TRUE, NULL },
   { "/_Test",           NULL,         0,           0, "<Branch>" },
   { "/Test/_Example",           NULL,         do_example,  0, NULL },
 };
@@ -1187,7 +1218,8 @@ static Buffer *
 create_buffer (void)
 {
   Buffer *buffer;
-
+  PangoTabArray *tabs;
+  
   buffer = g_new (Buffer, 1);
 
   buffer->buffer = gtk_text_buffer_new (NULL);
@@ -1206,6 +1238,20 @@ create_buffer (void)
   buffer->found_text_tag = gtk_text_buffer_create_tag (buffer->buffer, NULL);
   gtk_object_set (GTK_OBJECT (buffer->found_text_tag),
                   "foreground", "red", NULL);
+
+  tabs = pango_tab_array_new_with_defaults (4,
+                                            TRUE,
+                                            PANGO_TAB_LEFT, 10,
+                                            PANGO_TAB_LEFT, 30,
+                                            PANGO_TAB_LEFT, 60,
+                                            PANGO_TAB_LEFT, 120);
+  
+  buffer->custom_tabs_tag = gtk_text_buffer_create_tag (buffer->buffer, NULL);
+  gtk_object_set (GTK_OBJECT (buffer->custom_tabs_tag),
+                  "tabs", tabs,
+                  "foreground", "green", NULL);
+
+  pango_tab_array_free (tabs);
   
   buffers = g_slist_prepend (buffers, buffer);